package gbase

import (
	"context"
	"time"
)

// ContextWrapper 封装了 context.Context 和相关操作
type Ctx struct {
	ctx context.Context
}

// NewContextWrapper 创建一个新的 ContextWrapper
func NewCtx() *Ctx {
	return &Ctx{ctx: context.Background()}
}

// WithTimeout 设置上下文超时
func (cw *Ctx) WithTimeout(timeout time.Duration) *Ctx {
	cw.ctx, _ = context.WithTimeout(cw.ctx, timeout)
	return cw
}

// WithCancel 设置取消上下文
func (cw *Ctx) WithCancel() (*Ctx, context.CancelFunc) {
	var cancel context.CancelFunc
	cw.ctx, cancel = context.WithCancel(cw.ctx)
	return cw, cancel
}

// 在上下文中设置一个键值对
func (cw *Ctx) SetValue(key, value any) *Ctx {
	cw.ctx = context.WithValue(cw.ctx, key, value)
	return cw
}

// 从上下文中获取值
func (cw *Ctx) GetValue(key any) any {
	return cw.ctx.Value(key)
}

// 返回内部的 context.Context
func (cw *Ctx) GetContext() context.Context {
	return cw.ctx
}
